package com.sanploy.file.aop;

import com.sanploy.file.enums.FileType;
import com.sanploy.file.enums.Meta;
import com.sanploy.file.vo.BaseBean;
import com.sanploy.file.vo.BaseListResp;
import com.sanploy.file.vo.FileVo;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * Created by zhu yingzhi on 2017/8/31.
 */
@Aspect
@Component
public class ControllerAspect
{
    private final static Logger logger = LoggerFactory.getLogger(ControllerAspect.class);//参数为当前使用的类名

    @Pointcut("execution(public * com.sanploy.file.controller.*.*(..))")
    public void cutAspect(){
    }

//    @Before("cutAspect()")
//    public void doBefore(JoinPoint joinPoint){
//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//        HttpServletRequest request =  attributes.getRequest();
//        //url
//        logger.info("url ={}",request.getRequestURI());
//        //method
//        logger.info("method={}",request.getMethod());
//        //ip
//        logger.info("ip={}",request.getRemoteAddr());
//        //类方法
//        logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+'.'+ joinPoint.getSignature().getName());//获取类名及类方法
//        //参数
//        logger.info("args={}",joinPoint.getArgs());
//    }

    @Around("cutAspect()")
    public Object doAround(ProceedingJoinPoint pjp){
        BaseBean baseBean = new BaseBean();
        try {
//            url
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request =  attributes.getRequest();
        logger.info("url ={}",request.getRequestURI());
        //method
        logger.info("method={}",request.getMethod());
        //ip
        logger.info("ip={}",request.getRemoteAddr());
        //类方法
        logger.info("class_method={}",pjp.getSignature().getDeclaringTypeName()+'.'+ pjp.getSignature().getName());//获取类名及类方法

            logger.info("Type={}",pjp.getSignature().getDeclaringTypeName()+'.'+ pjp.getSignature().getDeclaringType().toString());//获取方法名
        //参数
        logger.info("args={}",pjp.getArgs());
            Object o=pjp.proceed();

            baseBean.setData(o);
            baseBean.setMeta(Meta.SUCCESS);
            baseBean.setResponse_time(System.currentTimeMillis());
            return baseBean;
//            if (o instanceof List){
////                BaseListResp baseListResp = new BaseListResp();
////                baseListResp.setData((List) o);
////                baseListResp.setMeta(Meta.SUCCESS);
////                System.out.println("我是List");
////                return baseListResp;
//
//            }else if (o instanceof String){
//                System.out.println("我是String");
//            } else {
//
//            }
//
//            System.out.println(o.getClass().toString());
        } catch (Exception e) {
            e.printStackTrace();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        baseBean.setMeta(Meta.Fail);
        return new FileVo(FileType.ORIGIN,"asd","asd");
    }

}
